/**
 * 箭头函数
 * 结构赋值
 * 。。。运算符
 * let，const：有作用域，不会变量提升
 */
var i =1
var i =2    //这个在var里是合法的
let b =1
let b =2    //这个编译不能通过，不能定义2个b，只能定义一个b，并且改变这个b

// 正确写法
let c = 1,
c = 2
console.log(c)            //2

// 连续定义和赋值写法
let c = e = 1,d=3
c = 2
console.log(c,e,d)        //2 1 3

// const用法同上，只是const定义的变量，不能重新赋值了
const d = 1
d=2
console.log(d)        //TypeError: Assignment to constant variable.

// *************************重要知识，使用let或const实现闭包
for(let i=0;i<5;i++){
  // 如果用var来定义这个i，那么结果是输出5个4
  setTimeout(()=>{
    console.log(i)    //0 1 2 3 4  ,,依次输出
  })
}

// let，const都不会变量提升，并且配合{}(这个大括号不是对象的意思，是代码块的意思)和形成暂存死区
// 以前代码是可以这么写的
{
  var i = 0
  console.log(i)      //可以套一层大括号写代码，在es5之前，这样写毫无意义，因为这对大括号是起不到封闭作用域效果
}

// 大括号配合let/const就可以形成作用域封闭效果(也叫暂存死区)
let i = 1
{
  i = 2
  console.log(i)      //2
}
console.log(i)        //2

// 一旦你在大括号里面重新定义i，那么i就不会取外面的i，并且在这个大括号内，不能重复定义i
let i = 1
{
  i=2                 //这个i指的是作用域里的i，因为let不能提升变量，所以i就变成了在未定义之前就使用，所以报错
  let i = 3
  console.log(i)      //ReferenceError: i is not defined    报错了，因为作用域里的i不能在let定义i之前使用
}
console.log(i)


// *************************************************结构赋值
// 有点多，不想写，看大神些的书
// http://es6.ruanyifeng.com/#docs/destructuring
